package vue.FenetrePartie;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JPanel;

import modele.Position;
import modele.Batiment.Batiment;

import controleur.Control;


public class Map extends JPanel implements MouseMotionListener, MouseListener{
	
	private static final long serialVersionUID = 1L;
	private Panneau p;
	private Image background;
	private Control controleur;
	private vue.FenetrePartie.Batiment batimentAttend;
	
	/**
	 * 
	 * @param p, c'est le panneau principal qui contient les 4 panneaux de la partie.
	 * 
	 * Ce panneau est le panneau principale de la vue, c'est celui en haut à gauche.
	 * Il contient la vue sur notre village
	 */
	public Map(Panneau p)
	{
		this.p = p;
		this.batimentAttend = new vue.FenetrePartie.Batiment(null, false);
		this.controleur = this.p.getControleur();
		this.setLayout (null);
		this.setBorder(BorderFactory.createLineBorder(Color.BLACK));
		this.background = new ImageIcon("images/finies/map.png").getImage();
		
		this.addMouseListener(this);
		this.addMouseMotionListener(this);
		
		this.rafraichir();
	}

	
	public void placerBatiment(Batiment batiment)
	{
		this.batimentAttend.setAttend(true);
		this.batimentAttend.setBatiment(batiment);
		this.repaint();
	}
	
	public void supprimerBatimentAttente()
	{
		this.batimentAttend.setAttend(false);
		this.remove(this.batimentAttend.getButton());
		this.repaint();
	}
	
	  public void paintComponent(Graphics g)
	  {
			super.paintComponent(g);
			g.drawImage(this.background, 0, 0, null);	
	  }


	  /**
	   * Permet de placer un batiment quand il y en a un en attente. 
	   */
	@Override
	public void mouseClicked(MouseEvent e) {

			if(this.batimentAttend.getAttend() == true)
			{
				this.batimentAttend.setAttend(false);

				vue.FenetrePartie.Batiment newBatiment = new vue.FenetrePartie.Batiment(this.batimentAttend.getBatiment(),this.batimentAttend.getAttend());
								
				newBatiment.getButton().setBounds(this.batimentAttend.getButton().getX(),this.batimentAttend.getButton().getY(),50,50);
				this.batimentAttend.getBatiment().setPosition(this.controleur.PositionVueToPositionModele(new Position(this.batimentAttend.getButton().getX(),(int) this.batimentAttend.getButton().getY())));
				this.controleur.construireBatiment(this.batimentAttend.getBatiment());
				this.add(newBatiment.getButton());
				this.removeAll();
				this.rafraichir();
			}
	}



	@Override
	public void mouseEntered(MouseEvent arg0) {
	}



	@Override
	public void mouseExited(MouseEvent arg0) {

	}



	@Override
	public void mousePressed(MouseEvent arg0) {
		
	}



	@Override
	public void mouseReleased(MouseEvent arg0) {
	
	}



	@Override
	public void mouseDragged(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}


	/**
	 * Permet de faire suivre un batiment sur le curseur de la souris, quand il y en a un en attente
	 */
	@Override
	public void mouseMoved(MouseEvent e) {
		int ajoutX = 0, ajoutY = 0;
		if(e.getSource()==this.batimentAttend.getButton())
		{
			ajoutX = this.batimentAttend.getButton().getX();
			ajoutY = this.batimentAttend.getButton().getY();			
		}
		
		if(this.batimentAttend.getAttend()==true)
		{		
			this.remove(this.batimentAttend.getButton());
			this.batimentAttend = new vue.FenetrePartie.Batiment(this.batimentAttend.getBatiment(),this.batimentAttend.getAttend());	
			this.batimentAttend.getButton().setBounds(e.getX()-25+ajoutX,e.getY()-25+ajoutY,50,50);
			this.batimentAttend.getButton().addMouseListener(this);
			this.batimentAttend.getButton().addMouseMotionListener(this);
			this.add(this.batimentAttend.getButton());
			this.repaint();
		}			
	}
	
	
	public Control getControl()
	{
		return this.controleur;
	}



	public void rafraichir() {

		this.removeAll();

		if(this.batimentAttend.getAttend()==true) 		this.add(this.batimentAttend.getButton());

		
		for(int i =0; i<this.controleur.recupererListeBatiment().size();i++)
		{
			vue.FenetrePartie.Batiment newBatiment = new vue.FenetrePartie.Batiment(this.controleur.recupererListeBatiment().get(i),true);
			Position pos = new Position(this.controleur.recupererListeBatiment().get(i).getPosition().getL(),this.controleur.recupererListeBatiment().get(i).getPosition().getC());
			pos = this.controleur.PositionModeleToPositionVue(pos);
			newBatiment.getButton().setBounds(pos.getL(),pos.getC(),50,50);
			MonEcouteurBatiment ecouteur = new MonEcouteurBatiment(newBatiment.getBatiment());

			newBatiment.getButton().addActionListener(ecouteur);
			this.add(newBatiment.getButton());
		}
		

		for(int i =0; i<this.controleur.getJoueur().getListeOuvrier().size();i++)
		{
			vue.FenetrePartie.Unite newUnite = new vue.FenetrePartie.Unite(this.controleur.getJoueur().getListeOuvrier().get(i));
			Position pos = this.controleur.getJoueur().getListeOuvrier().get(i).getPosition();
			pos = this.controleur.PositionModeleToPositionVue(pos);
			newUnite.getButton().setBounds(pos.getL(),pos.getC(),25,25);
			this.add(newUnite.getButton());
		}
		
		this.repaint();		
	}
	
	public class MonEcouteurBatiment implements ActionListener
	{
		private Batiment batiment;
		
		public MonEcouteurBatiment(Batiment batiment)
		{
			this.batiment = batiment;
		}
		
		public Batiment getBatiment(Batiment batiment)
		{
			return this.batiment;
		}
		
		@Override
		public void actionPerformed(ActionEvent e) {
			p.getPanneauInformationBatiment().deleteMenu();
			p.getPanneauInformationBatiment().addMenuSelectionBatiment(this.batiment);

		}		
	}

}
